home *** CD-ROM | disk | FTP | other *** search
/ LOGIC Apps / Logic-APPLE_II_APPS.iso / pc / LOGIC Apple II 5.25" Library - Forth / FORTH8.dsk < prev    next >
Text File  |  2012-02-16  |  143KB  |  2 lines

  1. ( ACKNOWLEDGEMENTS                                    14MAR82DAN  10 LIST  11 LOAD  ;S                                                                                                          WELCOME TO THE WORLD OF FULL SCREEN EDITING IN FORTH. THERE     IS DOCUMENTATION ON HOW TO USE THIS EDITOR ON SCREENS 12-23.    FURTHERMORE, THERE ARE SOME MODIFICATION NOTES ON SCREENS       42-44. I HOPE YOU WILL HAVE NO PROBLEMS USING THIS EDITOR.      IF YOU HAVE ANY QUESTIONS OR COMMENTS, PLEASE CONTACT ME AT     THE ADDRESS BELOW. BY THE WAY, THIS TAKES A LONG TIME TO        LOAD, SO PLEASE BE PATIENT. MAY THE FORTH BE WITH YOU.                                                                          HENRY LAXEN                   THIS EDITOR IS IN THE PUBLIC      1259 CORNELL AVE.             DOMAIN, AND MAY BE DISTRIBUTED    BERKELEY, CALIFORNIA          FURTHER WITH THE INCLUSION        94706                         OF THIS NOTICE.                   (415) 525-8582                                                  ( FULL SCREEN EDITOR - INSTRUCTIONS)                                                                                            THIS FULL SCREEN EDITOR APPEARED                                IN DR. DOBB'S JOURNAL SEPT. 1981                                AND HAS BEEN PUT IN THE PUBLIC                                  DOMAIN BY THE AUTHOR HENRY LAXEN.                                                                                               IT WAS WRITTEN FOR 80 CHARACTER                                 CRT'S AND USES FIG-FORTH'S FULL                                 64 CHARACTER LINES.  THE EDITOR                                 MAY BE USED WITH THE 40 CHARACTER                               APPLE WITH NO DIFFICULTY IN                                     ENTERING NEW PROGRAMS.  IF YOU USE                              IT TO EDIT 64 CHAR/LINE PROGRAMS                                (LIKE THE EDITOR ITSELF, FOR                                    EXAMPLE) THE OUTPUT WILL BE VERY                                ( INSTRUCTIONS - CONT'D)                                        HARD TO READ AND EQUALLY HARD TO                                EDIT!                                                                                                                           THE FULL SCREEN EDITOR HAS BEEN                                 MODIFIED BY DAVE NEUMANN AND                                    BILL WURZEL TO RUN ON THE APPLE.                                TO TAKE ADVANTAGE OF THE SPEED                                  INCREASE RESULTING FROM THE 6502                                CODE FOR BMOVE (SCREENS 30 AND 31)                              YOU MUST HAVE INSTALLED THE FORTH                               ASSEMBLER, ALSO AVAILABLE FROM                                  WASHINGTON APPLE PI.                                                                                                                                                                                                                                            ( INSTRUCTIONS CONT'D )                                                                                                         PLEASE NOT THAT TO COMPILE THE FULL                             SCREEN EDITOR, THIS DISK MUST BE IN                             DRIVE 1.  (TO USE IN DRIVE 2,                                   CHANGE THE '89' IN SCREEN #88 TO                                '189'.)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         ( ACKNOWLEDGEMENTS                                   21AUG82WDW)TO COMPILE TYPE:  10 LIST  11 LOAD  ;S                          ( DR. DOBB'S  SEPTEMBER 1981  PAGES 27-41  )                    WELCOME TO THE WORLD OF FULL SCREEN EDITING IN FORTH. THERE     IS DOCUMENTATION ON HOW TO USE THIS EDITOR ON SCREENS 12-23.    FURTHERMORE, THERE ARE SOME MODIFICATION NOTES ON SCREENS       42-44. I HOPE YOU WILL HAVE NO PROBLEMS USING THIS EDITOR.      IF YOU HAVE ANY QUESTIONS OR COMMENTS, PLEASE CONTACT ME AT     THE ADDRESS BELOW. BY THE WAY, THIS TAKES A LONG TIME TO        LOAD, SO PLEASE BE PATIENT. MAY THE FORTH BE WITH YOU.                                                                          HENRY LAXEN                   THIS EDITOR IS IN THE PUBLIC      1259 CORNELL AVE.             DOMAIN, AND MAY BE DISTRIBUTED    BERKELEY, CALIFORNIA          FURTHER WITH THE INCLUSION        94706                         OF THIS NOTICE.                   (415) 525-8582                                                  ( LOAD SCREEN FOR SYSTEM GENERATION                  16MAR82DAN)                                                                                                                                24 LOAD  ( LOAD GENERAL PURPOSE STUFF )                         38 LOAD  ( LOAD THE EDITOR )                                                                                                    ;S                                                                                                                                NOTE!!, THIS EDITOR ASSUMES THAT BLOCKS ARE 1024 BYTES        IN LENGTH, AND THAT THE FIG FORTH ENCLOSE BUG HAS BEEN          FIXED. IF THIS IS NOT THE CASE, IT WILL REQUIRE MODIFICATION    IN SEVERAL PLACES, MOST NOTABLY IN:                                E-INIT                                                          E-UPDATE                                                        E-EXIT, E-SCRATCH                                                                                                            FORTH DEVELOPMENT SYSTEM DOCUMENTATION               16MAR82DAN)                                                                                                                                   THE FORTH EDITOR IS EASY TO LEARN AND TO USE. IT CONSISTS OF CONTROL KEY COMMANDS THAT ALLOW CURSOR MOVEMENT AND TEXT ENTRY  AND DELETION SO THAT EDITING CAN BE DONE QUICKLY AND SMOOTHLY.                                                                                                                                  CURSOR MOVEMENT                                                                                                                    YOU CAN PLACE THE CURSOR ANYWHERE ON THE SCREEN BY USING A   FEW EDITING COMMANDS.                                                                                                              THE FOLLOWING TABLE DESCRIBES THE COMMANDS THAT ARE RELEVANT TO CURSOR MOVEMENT.                                                                                                             CURSOR MOVEMENT COMMANDS                             16MAR82DAN)                                                                COMMAND         FUNCTION         DESCRIPTION                                                                                      ^E            CURSOR UP        MOVES CURSOR UP TO THE SAME                    A LINE           POSTION IN THE PRECEDING LINE.                                                                   ^X            CURSOR DOWN      MOVES CURSOR DOWN TO THE SAME                  A LINE           POSITION IN THE NEXT LINE.                                                                      *^R            CURSOR UP        MOVES CURSOR TO THE SAME                       FOUR LINES       POSITION FOUR LINES UP.                                                                         *^C            CURSOR DOWN      MOVES CURSOR TO THE SAME                       FOUR LINES       POSITION FOUR LINES DOWN.                                                                      CURSOR MOVEMENT COMMANDS                             16MAR82DAN)                                                                   ^S           CURSOR LEFT      MOVES CURSOR TO THE               ^H           ONE CHARACTER    PREVIOUS CHARACTER OR             DELETE                        SPACE.                                                                                            ^D           CURSOR RIGHT     MOVES CURSOR TO THE NEXT                       ONE CHARACTER    CHARACTER OR SPACE.                                                                               ^F           CURSOR RIGHT     MOVES CURSOR FORWARD TO THE                    A WORD           FIRST LETTER OF THE NEXT WORD                                   GOING TO THE BEGINNING OF THE                                   NEXT LINE IF AT THE END OF THE                                  CURRENT LINE.                                                                                                                                                  CURSOR MOVEMENT COMMANDS                             16MAR82DAN)   ^A           CURSOR LEFT     MOVES CURSOR BACK TO THE FIRST                  A WORD          LETTER OF THE PREVIOUS WORD                                     GOING TO THE END OF THE PREVIOUS                                LINE IF AT THE BEGINNING OF THE                                 CURRENT LINE.                                                                                      ^I           TAB             MOVES THE CURSOR TO THE NEXT TAB   TAB                          STOP ON THE LINE GOING TO THE                                   NEXT LINE IF AT THE END OF THE                                  CURRENT LINE.                   * THE POSITION OF THE CURSOR WILL DIFFER DEPENDING ON THE NUMBEROF INTERVENING LINES BETWEEN THE TOP AND THE BOTTOM OF THE      SCREEN. IF YOU ENTER ^R WHEN THE CURSOR IS LESS THAN FOUR LINES DOWN FROM THE TOP OF THE SCREEN, THE CURSOR MOVES TO THE FIRST  SPACE ON THE FIRST LINE.                                        CURSOR HINTS                                         16MAR82DAN)                                                                SIMILARLY, IF THE CURSOR IS LESS THAN FOUR LINES UP FROM THE    BOTTOM OF THE SCREEN, ^C MOVES IT TO THE LAST SPACE ON THE      BOTTOM LINE.                                                                                                                       USING THESE COMMANDS SINGLY OR IN COMBINATIONS, YOU CAN MOVE THE CURSOR WHEREVER YOU WANT IT. IF, FOR INSTANCE, YOU WANT TO  MOVE THE CURSOR TO THE END OF THE CURRENT LINE, YOU ENTER THE   FOLLOWING COMBINATION:                                                                                                                                <CR> CARRIAGE RETURN                                             ^A                                                                                                          WHEN THE CURSOR IS ANYWHERE IN THE LAST LINE, YOU CAN MOVE   IT TO THE BEGINNING OF THAT LINE BY ENTERING A CARRIAGE RETURN. TEXT ENTRY AND DELETION                              16MAR82DAN)                                                                   WITH SPECIAL EDITING COMMANDS, YOU CAN ENTER ADDITIONAL TEXT OR TAKE OUT EXISTING TEXT IN YOUR FORTH SCREENS. THE FOLLOWING  TABLES DESCRIBE THE COMMANDS THAT ARE RELEVANT TO TEXT ENTRY    AND DELETION.                                                                                                                                           TEXT ENTRY                                                                                              COMMAND         FUNCTION        DESCRIPTION                                                                                      *^V           INSERTION       TYPES OVER CHARACTERS WHEN OFF                  OFF/ON          AND INSERTS CHARACTER WHEN ON.                                  WHEN ON, INSERT ON APPEARS IN                                   THE TOP (STATUS) LINE. ^V IS A                                  TOGGLE THAT TURNS INSERT OFF    SPREADING LINES                                      16MAR82DAN)                                WHEN IT IS ON AND ON WHEN IT IS                                 OFF.                                                                                               ^N           INSERT          INSERTS A CARRIAGE RETURN AT THE                CARRIAGE        CURSOR POSITION, AND LEAVES                     RETURN          CURSOR UNMOVED. ALL TEXT TO THE                                 RIGHT OF AND BELOW CURSOR MOVES                                 DOWN ONE LINE, BUT ONLY IF THE                                  LAST LINE IS BLANK. TEXT IN THE                                 LAST LINE DISABLES THIS COMMAND.                                                                * A CARRIAGE RETURN HAS THE SAME EFFECT ON THE TEXT WHETHER ^V  (INSERT MODE) IS ON OR OFF. IN OTHER WORDS, PRESSING CARRIAGE   RETURN WHILE INSERT IS ON WILL NOT RESULT IN INSERTING A        CARRIAGE RETURN.                                                TEXT DELETION                                        16MAR82DAN)                                                                COMMAND        FUNCTION        DESCRIPTION                                                                                         ^G          DELETE          DELETES THE CHARACTER UNDER                     CHARACTER       THE CURSOR AND MOVES EVERYTHING                 RIGHT           TO THE RIGHT IF IT LEFT ONE                                     CHARACTER.                                                                                          ^T          DELETE          DELETES WORD CONTAINING THE                     WORD RIGHT      CURSOR, SPECIFICALLY THE                                        CHARACTER UNDER THE CURSOR AND                                  THE CHARACTERS TO THE RIGHT OF                                  IT TO THE END OF THE LINE.                                                                                                                                       DELETING TEXT                                        16MAR82DAN)                                                                   ^B           DELETE LINE    DELETES THE TEXT IN THE CURRENT                  CONTENTS       LINE WITHOUT DELETING THE LINE                                  (LEAVES A BLANK LINE).                                                                              ^Y           DELETE LINE    DELETES THE CURRENT LINE AND                                    MOVES THE LINES UNDER IT UP                                     THEREBY SHRINKING THE SCREEN.                                                                       ^K           DELETE         DELETES CONTENTS OF THE ENTIRE                   (KILL)         SCREEN.                                          SCREEN                                                                                                                                                                                                                                          EXITING FROM THE EDITOR                              16MAR82DAN)                                                                   ^Z           ABONDON      EXITS FROM THE EDITOR. THE                         SCREEN       BLOCK IS NOT MARKED AS UPDATED.                                 HENCE, TYPING EMPTY-BUFFERS AT                                  THIS POINT WILL ALLOW YOU TO                                    RETRIEVE THE CONTENTS OF THE                                    SCREEN AS IT WAS BEFORE ANY                                     EDITING TOOK PLACE. IF YOU                                      RE-ENTER THE EDITOR BEFORE                                      TYPING EMPTY-BUFFERS, YOU WILL                                  GET THE EDITED VERSION OF THE                                   SCREEN.                                                                                                                                                                                                                            EXITING FROM THE EDITOR                              16MAR82DAN)                                                                  ESC          EXIT        EXITS THE EDITOR AND WRITES THE                     EDITOR      SCREEN BACK TO DISK IF IT WAS                                   MODIFIED. THE USED ID IS AUTO-                                  MATICALLY INSERTED IN THE RIGHT-                                MOST 10 CHARACTERS OF LINE 0.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        CURSOR POSITIONING WORDS                             16MAR82DAN)                                                                AT THE END OF THE EDITOR YOU WILL FIND THE CURSOR POSITIONING   ROUTINES REQUIRED FOR SOME CURRENTLY AVAILABLE TERMINALS.       LOAD THE SCREEN THAT CORRESPONDS TO YOUR TERMINAL. IF IT ISN'T  THERE, YOU WILL HAVE TO WRITE YOUR OWN ROUTINES. THIS IS EASY   AND YOU CAN USE THE ONES PROVIDED AS A MODEL.                                                                                   GOOD LUCK, AND MAY THE FORTH BE WITH YOU.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       ( \                COMMENT TO END OF LINE            16MAR82DAN)                                                                : \     ( --- )                                                    IN @ C/L / 1+ C/L * IN ! ;                                      IMMEDIATE                                                                                                                    \    THIS IS THE COMMENT CHARACTER WHICH SHOULD ONLY BE USED    \ INSIDE OF SCREENS. IT WILL CAUSE ALL SUBSEQUENT CHARACTERS    \ ON ITS LINE TO BE IGNORED. INTERPRETATION WILL BEGIN ON THE   \ FOLLOWING LINE. NOTE THAT \ MUST BE FOLLOWED IMMEDIATELY BY   \ A SPACE.                                                                                                                      -->                                                                                                                                                                                                                                                             \ (S   (P     DOCUMENTATION WORDS                    16MAR82DAN)                                                                : (S      ( --- )                                                  41 WORD ;          \ SKIP TO )                                  IMMEDIATE                                                                                                                    \ (S IS USED FOR STACK COMMENTS. A UTILITY MAY BE WRITTEN       \ LATER TO EXTRACT THESE )                                                                                                      : (P       ( -- )                                                  41 WORD ;           \ SKIP TO )                                 IMMEDIATE                                                                                                                    \ (P IS USED FOR DESCRIPTIVE COMMENTS. A UTILITY MAY BE         \ WRITTEN LATER TO EXTRACT THESE )                              -->                                                             \ DEPTH        RETURN DEPTH OF STACK                 16MAR82DAN)                                                                6 USER S0                                                                                                                       : DEPTH    (S --- N )                                              SP@ S0 @ SWAP - 2 / 0 MAX ;                                                                                                  (P   RETURNS THE CURRENT DEPTH OF THE STACK. THIS WORD MAY NEED \ TO BE REDEFINED WHEN RUNNING ON OTHER SYSTEMS, AS IT USES A   \ COMPUTER DEPENDENT WORD CALLED S0, WHICH CONTAINS THE STARTING\ ADDRESS OF THE STACK. )                                                                                                       -->                                                                                                                                                                                                                                                             \ L             INTELLIGENT SCREEN LISTS             16MAR82DAN)                                                                : L     (S [N] --- )                                               DEPTH IF            \ IS THERE ANYTHING THERE                    DUP SCR !          \ YES, REMEMBER IT                          ELSE                                                             SCR @              \ NO, RETRIEVE LAST ONE                     ENDIF                                                           LIST ;              \ AND LIST IT                                                                                            (P   L WILL LIST THE SPECIFIED SCREEN AND REMEMBER              \ WHAT IT WAS. IF THE DEPTH OF THE STACK IS ZERO, IT WILL       \ LIST THE LAST SCREEN PREVIOUS LISTED. IT MAKES USE OF         \ THE USER VARIABLE SCR.  )                                                                                                     -->                                                             \ 2DROP 2* BEEP                                      16MAR82DAN)                                                                : 2DROP      (S N1 N2 --- )                                        DROP DROP ;                                                  (P  2DROP DROPS 2 ITEMS OFF OF THE PARAMETER STACK. )                                                                           : 2*         (S N --- 2*N )                                        DUP + ;                                                      (P 2* SIMPLY DOUBLES THE ITEM ON THE TOP OF THE STACK )                                                                         : BEEP       (S --- )                                              7 EMIT ;                                                     (P RING THE BELL ON THE TERMINAL. USUALLY AFTER AN ERROR )                                                                      -->                                                                                                                             \ BOUNDS        DO LOOP SETUP                        16MAR82DAN)                                                                : BOUNDS    (S ADDR LEN --- ADDR+LEN ADDR )                        OVER + SWAP ;                                                                                                                (P BOUNDS IS A COMMON DO LOOP SETUP WORD. IT ASSUMES THERE IS   \ AN ADDRESS AND A LENGTH ON THE STACK. BOUNDS CONVERTS THIS    \ INTO A HIGH ADDRESS AND A LOW ADDRESS. THE I INDEX OF A DO    \ LOOP WILL THEN RUN THROUGH THIS RANGE OF VALUES WHILE         \ EXECUTING. )                                                                                                                  -->                                                                                                                                                                                                                                                                                                                             \ BMOVE         6502 CODE VERSION OF BMOVE           21AUG82WDW)           \ REMOVE THIS ARROW TO USE THIS WORD                 CODE BMOVE1                                                                   0 # LDY, 3 # LDA, SETUP JSR,                      BEGIN, N 4 + )Y LDA, N 2 + )Y STA,                              SEC, N 4 + LDA, 1 # SBC, N 4 + STA,                             CS NOT IF, N 5 + DEC, THEN,                                     SEC, N 2 + LDA, 1 # SBC, N 2 + STA,                             CS NOT IF, N 3 + DEC, THEN,                                     N INC, 0= IF, N 1+ INC, THEN,                                   0= UNTIL,                                                                                                                       NEXT JMP, END-CODE                                                                                                              -->                                                                                                                             \ BMOVE           CONT'D                             21AUG82WDW)      \ REMOVE THIS ARROW TO USE THIS WORD                      : BMOVE                                                              -DUP IF 1 - >R R + SWAP     \ FORMAT FROM-TO-LENGTH           R + SWAP R> 1+ MINUS BMOVE1   \ PARAMETERS FOR 6502             ELSE DROP DROP THEN ;         \ MAIN ROUTINE                                                                                 -->                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             \ BMOVE         HIGH LEVEL                           21AUG82WDW) -->         \ REMOVE THE FIRST \ IF THE CODE VERSION IS USED                                                                   : BMOVE     (S FROM TO LEN --- )                                   -DUP IF                      \ ANYTHING TO MOVE?                 >R R + 1 - SWAP 1 -         \ YES, MOVE FROM HIGH               R> BOUNDS SWAP DO           \ MEMORY TO LOW MEMORY               I C@ OVER C!               \ *                                  1 - -1                     \ *                                 +LOOP DROP                                                     ELSE                                                             2DROP                       \ NOTHING TO DO, SO FORGET IT      ENDIF ;                                                      (P BMOVE IS IDENTICAL TO CMOVE EXCEPT IT MOVES                  \ CHARACTERS IN THE OTHER DIRECTION. )                          -->                                                             \ MOVE          WORKS IN EITHER DIRECTION            16MAR82DAN): 2DUP    OVER OVER ;                                                                                                           : MOVE   (S FROM TO LEN --- )                                      ROT ROT 2DUP U< IF                                                ROT BMOVE                                                     ELSE                                                              ROT CMOVE                                                     ENDIF ;                                                                                                                      (P MOVE WILL MOVE LEN BYTES FROM ADDRESS FROM TO ADDRESS TO     \ AND WILL NOT OVERLAP THEM, NO MATTER WHAT THE RELATIVE VALUES \ OF FROM TO AND LEN ARE. MOVE SHOULD ALWAYS BE USED WHENEVER   \ THERE IS DANGER OF OVERLAPPING FIELDS. )                                                                                      -->                                                             \ 1- 2-         DECREMENT                            16MAR82DAN)                                                                : 1-    (S N --- N-1 )                                             1 - ;                                                                                                                        : 2-    (S N --- N-2 )                                             2 - ;                                                                                                                        -->                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             \ >= <> <= U>   CONDITIONALS                         16MAR82DAN)                                                                : >=    (S N1 N2 --- BOOL )                                        < 0= ;                                                                                                                       : <>    (S N1 N2 --- BOOL )                                        = 0= ;                                                                                                                       : <=    (S N1 N2 --- BOOL )                                        > 0= ;                                                                                                                       : U>    (S N1 N2 --- BOOL )                                        SWAP U< ;                                                                                                                    -->                                                                                                                             \ RE-FORTH      RE-ENTER FORTH FOR 1 LINE            16MAR82DAN)                                                                : RE-FORTH    (S --- ??? )                                         IN @ >R                    \ SAVE INPUT BUFFER POINTER          BLK @ >R                   \ SAVE BLOCK NUMBER                  0 IN ! 0 BLK !             \ RESET FOR TERMINAL INPUT           QUERY INTERPRET            \ GET 1 LINE FROM TERMINAL           R> BLK !                   \ RESTORE BLOCK NUMBER               R> IN ! ;                  \ RESTORE INPUT BUFFER POINTER                                                                    (P RE-FORTH REENTERS THE FORTH INTERPRETER FROM THE TERMINAL    \ AND ALLOWS THE USER TO ENTER 1 LINE OF VALID FORTH COMMANDS.  \ THIS IS A SIMPLE WAY TO PROMPT FOR TERMINAL MESSAGES WHILE    \ IN THE MIDDLE OF LOADING. )                                                                                                   -->                                                             \ ?DUP          SAME AS -DUP FOR FORTH-79            16MAR82DAN)                                                                : ?DUP   (S N --- [N] N )                                          -DUP ;                                                                                                                       (P DUPLICATES THE TOP OF THE STACK IF THE TOP IS                \ NONZERO. IF THE TOP IS ZERO, THEN IT IS NOT DUPLICATED.       \ THIS IS DEFINED PRIMARILY FOR FORTH-79 COMPATIBILITY )                                                                        ;S                                                                                                                                                                                                                                                                                                                                                                                                                                                              \ CASE:                                              16MAR82DAN)                                                                : CASE:    (S N --- )                                              <BUILDS   ] SMUDGE                                              DOES>                                                            SWAP 2* + @                                                     EXECUTE ;                                                                                                                   (P CASE: IS A POOR MAN'S CASE STATEMENT. AT COMPILE TIME, IT    \ SIMPLY COMPILES CODE FIELD ADDRESS AS DOES : AT RUN TIME, IT  \ EXPECTS AN INDEX ON THE STACK, AND SIMPLY INDEXES INTO THE    \ DEFINED WORDS AND EXECUTES IT. )                                                                                              -->                                                                                                                                                                                             \ -TIDY                                              16MAR82DAN)                                                                : -TIDY   (S ADDR LEN --- )                                        BOUNDS DO                    \ RUN THROUGH THE STRING            I C@ BL < IF                \ IS IT A CONTROL CHAR?              BL I C!                    \ YES, REPLACE IT WITH A BLANK      ENDIF                                                          LOOP ;                                                                                                                       (P -TIDY REPLACES ALL CONTROL CHARACTERS IN A SPECIFIED         \ RANGE WITH BLANKS )                                                                                                           -->                                                                                                                                                                                                                                                             \ VARIABLE AND CONSTANT DEFINITIONS                  16MAR82DAN)   VOCABULARY EDITOR IMMEDIATE EDITOR DEFINITIONS                0 VARIABLE &MODE         \ CURRENT MODE ( OVERSTRIKE OR INSERT  0 VARIABLE &CURSOR       \ CURSOR POSITION                      0 VARIABLE &OLD-MODE     \ PREVIOUS MODE                        0 VARIABLE &UPDATE       \ UPDATE FLAG                          0 VARIABLE &BUF-ADR      \ ADDRESS OF CURRENT BUFFER            0 VARIABLE &E-ID         \ DATE AND USER ID LAST MODIFIED          13 ALLOT                                                       &E-ID 15 BLANKS        \ INITIALIZE TO BLANKS                0 VARIABLE SCR-BUF 1024 ALLOT \ NEEDED SINCE BLK<1024            5 CONSTANT %X-OFF        \ X OFFSET FOR CURSOR POSITIONING      2 CONSTANT %Y-OFF        \ Y OFFSET FOR CURSOR POSITIONING     B/SCR B/BUF *    CONSTANT C/SCR   \ CHARACTER PER SCREEN        C/SCR C/L   /    CONSTANT L/SCR   \ LINES PER SCREEN            -->                                                             \ CURSOR POSITIONING VECTORS                         16MAR82DAN)                                                                0 VARIABLE 'CRTXY          \ CFA OF ROUTINE THAT MOVES CURSOR   0 VARIABLE 'CRTCLR-SCR     \ CFA OF ROUTINE THAT CLEARS SCREEN  0 VARIABLE 'CLEAR-TO-EOL   \ CFA OF ROUTINE THAT CLEARS TO EOL                                                                  : CRTXY        (S X Y --- )                                        'CRTXY @ EXECUTE ;                                                                                                           : CRTCLR-SCR   (S --- )                                            'CRTCLR-SCR @ EXECUTE ;                                                                                                      : CLEAR-TO-EOL   (S --- )                                          'CLEAR-TO-EOL @ EXECUTE ;                                    -->                                                                                                                             \ DESCRIPTION OF CURSOR COMMANDS                     16MAR82DAN)-->                                                             THE CRTXY COMMAND MUST POSITION THE CURSOR AT THE X AND Y       CO-ORDINATES GIVEN ON THE STACK. IF YOUR TERMINAL DOES NOT      SUPPORT CURSOR POSITIONING, GIVE UP.                                                                                            THE CRTCLR-SCR SHOULD CLEAR THE ENTIRE SCREEN AND HOME THE      CURSOR. IF SUCH A COMMAND IS NOT AVAILABLE, OUTPUT A SUFFICIENT NUMBER OF LINE-FEEDS TO CLEAR THE SCREEN VIA SCROLLING, AND THENCALL CRTXY WITH 0 0 .                                                                                                           THE CRTCLR-EOL COMMAND SHOULD CLEAR THE LINE FROM ITS CURRENT   LOCATION TO THE END OF THE LINE. THE FOLLOWING WILL ALWAYS      WORK, BUT IF YOUR TERMINAL SUPPORTS SOMETHING MORE SOPHISTICATEDYOU SHOULD USE IT.                                                        C/L MOD C/L SWAP - SPACES                             \ DESCRIPTION OF CURSOR POSITIONING COMMANDS         16MAR82DAN)                                                                -->                                                                                                                             NOTE!!                                                          THE CLEAR-TO-EOL COMMAND IS ALWAYS CALLED WITH THE CURSOR       POSITIONED AT THE CORRECT PLACE ON THE SCREEN. HENCE IF         YOUR TERMINAL SUPPORTS A CLEAR TO END OF LINE COMMAND, THE      POSITION PASSED CAN BE SIMPLY DROPPED AND THE TERMINAL          COMMAND ISSUED. IF THE TERMINAL DOES NOT SUPPORT SUCH A         COMMAND, YOU MUST BLANK OUT THE REMAINDER OF THE LINE BASED     ON THE CURSOR POSITION THAT WAS PASSED.                                                                                                                                                                                                                                                                                         \ DESCRIPTION OF CURSOR POSITIONING COMMANDS         16MAR82DAN)                                                                -->                                                                                                                             IF YOU SHOULD LIKE TO SEE HOW SOME SAMPLE CURSOR POSITIONING    ROUTINES WERE WRITTEN, TAKE A LOOK AT SCREENS 90-92. NOTE       THAT YOU MAY WRITE YOUR OWN ROUTINES EVEN AFTER THE COMPLETE    EDITOR HAS BEEN LOADED. ALL YOU NEED TO DO IS PATCH THE EXECUTE VECTORS FOR YOUR PARTICULAR TERMINAL. GOOD LUCK.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                \ CURPOS +CURPOS   MOVE-CURSOR                       16MAR82DAN): CURPOS   (S --- POS )                                            &CURSOR @ ;              \ RETURN CURRENT CURSOR POSITION                                                                    : +CURPOS   (S N --- )                                             &CURSOR +!                                                      CURPOS 0 MAX             \ AND DO BOUNDS CHECKING               [ C/SCR 1- ] LITERAL     \ CHAR PER SCREEN - 1                  MIN &CURSOR ! ;          \ ALWAYS VALID                                                                                      : MOVE-CURSOR   (S N --- )                                         +CURPOS                  \ MOVE THE CURSOR                      CURPOS C/L /MOD          \ RAW X Y                              %Y-OFF + SWAP            \ ADD IN Y OFFSET                      %X-OFF + SWAP            \ ADD IN X OFFSET                      CRTXY ;        -->       \ AND MOVE THERE                    \ BUF-ADR   BUFPOS                                   16MAR82DAN)                                                                : BUF-ADR   (S POS --- ADR )                                       &BUF-ADR @ + ;                                                                                                               (P BUF-ADR CONVERTS THE CURSOR POSITION IT IS CALLED WITH       \ TO THE ADDRESS WITHIN THE DISK BUFFER WHICH CORRESPONDS       \ TO THAT POSITION )                                                                                                            : BUFPOS   (S --- ADDR )                                           CURPOS BUF-ADR ;                                                                                                             (P BUFPOS RETURNS THE ADDRESS IN THE DISK BUFFER OF THE         \ CURRENT CHARACTER )                                                                                                           -->                                                             \ E-UPDATE  MOVE-BLK  MOVE-SCR                       16MAR82DAN)                                                                : E-UPDATE   (S --- )                                              1 &UPDATE ! ;                    \ SET THE UPDATE FLAG                                                                       (P E-UPDATE IS CALLED WHENEVER THE CONTENTS OF THE BUFFER       \ HAS CHANGED. IT SETS THE UPDATE FLAG. )                                                                                       : MOVE-BLK   (S BLK# --- )                                         DUP BLOCK SWAP B/SCR MOD B/BUF * SCR-BUF +                      B/BUF CMOVE ;     \ MOVE BLOCK TO SCREEN BUFFER                                                                              : MOVE-SCR   (S SCR# --- )                                         B/SCR * DUP B/SCR + SWAP                                        DO I MOVE-BLK LOOP ;    \ MOVE BLKS TO SCREEN BUFFER         -->                                                             \ BUF-MOVE                                           16MAR82DAN)                                                                : BUF-MOVE   (S FROM TO LEN --- )                                  ROT BUF-ADR                                                     ROT BUF-ADR                                                     ROT MOVE                                                        E-UPDATE ;                                                                                                                   (P BUF-MOVE PERFORMS A MOVE OPERATION ON THE CHARACTERS IN THE  \ DISK BUFFER CORRESPONDING TO THE GIVEN CURSOR POSITIONS. )                                                                    -->                                                                                                                                                                                                                                                                                                                             \ ?PRINTABLE                                         16MAR82DAN)                                                                : ?PRINTABLE   (S CHAR -- BOOL )                                   DUP 32 <                                                        SWAP 126 >                                                      OR 0= ;                                                                                                                      (P ?PRINTABLE RETURNS A TRUE FLAG IF THE CHARACTER IS PRINTABLE.\ OTHERWISE IT RETURNS A FALSE FLAG )                                                                                           -->                                                                                                                                                                                                                                                                                                                                                                                             \ >LINE# LINE#>                                      16MAR82DAN)                                                                : >LINE#   (S POS --- LINE# )                                      C/L / ;                                                                                                                      (P CONVERT A CHARACTER POSITION TO A LINE NUMBER )                                                                              : LINE#>   (S LINE# --- POS )                                      C/L * ;                                                                                                                      (P CONVERT A LINE NUMBER TO A CHARACTER POSITION )                                                                              -->                                                                                                                                                                                                                                                             \ CHARS-TO-EOL                                       16MAR82DAN)                                                                : CHARS-TO-EOL   (S POS --- N )                                    C/L MOD                                                         C/L SWAP - ;                                                                                                                 (P CHARS-TO-EOL RETURNS THE NUMBER OF CHARACTERS LEFT ON THE    \ LINE GIVEN THE CURRENT CHARACTER POSITION )                                                                                   -->                                                                                                                                                                                                                                                                                                                                                                                                                                                             \ DISPLAY-TO-EOL                                     16MAR82DAN)                                                                : DISPLAY-TO-EOL   (S POS --- )                                    DUP BUF-ADR           \ GET ADDRESS IN BUFFER                   OVER CHARS-TO-EOL     \ REST OF LINE                            -TRAILING             \ IGNORE BLANKS                           ROT OVER + >R         \ SAVE RESULTANT CURSOR POSITION          TYPE                  \ DISPLAY WHATS THERE                     R> CLEAR-TO-EOL       \ AND REMOVE THE REST                     ;                                                                                                                            (P DISPLAY-TO-EOL DISPLAYS THE REST OF THE LINE STARTING FROM   \ THE CURRENT CURSOR POSITION. IT ASSUMES THAT THE TERMINAL     \ CURSOR IS PROPERLY POSITIONED BEFORE IT EXECUTES. )                                                                           -->                                                             \ ?EMPTY-LINE                                        16MAR82DAN)                                                                : ?EMPTY-LINE   (S LINE# --- BOOL )                                LINE#> BUF-ADR C/L       \ ADDR LEN                             -TRAILING                \ REMOVE TRAILING BLANKS               SWAP DROP 0=             \ REPORT SUCCESS IF ALL BLANKS         ;                                                                                                                            (P ?EMPTY-LINE RETURNS TRUE IF THE SPECIFIED LINE NUMBER IS     \ COMPLETELY BLANK. OTHERWISE IT RETURNS FALSE. )                                                                               -->                                                                                                                                                                                                                                                                                                                             \ DISPLAY-TO-EOS                                     16MAR82DAN)                                                                : DISPLAY-TO-EOS   (S LINE# --- )                                  CURPOS SWAP                \ SAVE CURRENT CURSOR POSITION       L/SCR SWAP DO              \ RUN THROUGH REST OF SCREEN          I LINE#>                                                        DUP &CURSOR !             \ SET CURSOR POSITION                 0 MOVE-CURSOR                                                   DISPLAY-TO-EOL            \ AND DISPLAY LINE FROM THERE        LOOP                                                            &CURSOR !                  \ RESTORE CURSOR POSITION            0 MOVE-CURSOR ;                                              (P DISPLAY THE ENTIRE SCREEN FROM THE GIVEN LINE NUMBER TO      \ THE END OF THE SCREEN. THIS IS USED WHEN A LINE IS            \ INSERTED OR DELETED FROM THE MIDDLE OF THE SCREEN )           -->                                                             \ EXPAND                                             16MAR82DAN)                                                                : EXPAND   (S POS --- )                                            DUP DUP                    \ P P P                              C/L +                      \ P FROM TO                          C/SCR OVER -               \ P FROM TO LEN                      BUF-MOVE                   \ TEXT MOVED IN BUFFER               BUF-ADR C/L BLANKS         \ INSERT BLANK LINE                  E-UPDATE ;                                                                                                                   (P EXPAND MOVES ALL OF THE LINES DOWN BY ONE AND INSERTS        \ A BLANK LINE AT THE SPECIFIED POSITION. )                                                                                                                                                     -->                                                                                                                             \ SHRINK                                             16MAR82DAN)                                                                : SHRINK   (S POS --- )                                            DUP                        \ POS POS                            C/L + SWAP                 \ FROM TO                            OVER C/SCR SWAP -          \ FROM TO LEN                        BUF-MOVE                   \ MOVE IT                            [ L/SCR 1- ] LITERAL       \ INSERT A BLANK LINE                LINE#> BUF-ADR C/L BLANKS  \ AT THE BOTTOM OF THE SCREEN        E-UPDATE ;                                                                                                                   (P SHRINK DELETES THE SPECIFIED LINE IN THE DISK BUFFER AND     \ REPLACES THE LAST LINE OF THE SCREEN WITH A BLANK LINE )                                                                      -->                                                                                                                             \ INSERT-LINE                                        16MAR82DAN)                                                                : INSERT-LINE   (S POS --- )                                       [ L/SCR 1- ] LITERAL         \ LAST LINE NUMBER                 ?EMPTY-LINE IF               \ IS IT EMPTY?                      DUP EXPAND                  \ YES, EXPAND THE BUFFER            >LINE# DISPLAY-TO-EOS       \ AND REDISPLAY THE SCREEN         ELSE                                                             BEEP                        \ NO, WARN USER                    ENDIF ;                                                                                                                      (P INSERT-LINE CHECKS TO SEE THAT THERE IS NO TEXT ON THE       \ LAST LINE OF THE SCREEN. IF THERE IS NONE, IT EXPANDS THE     \ SCREEN AT THE GIVEN CURSOR POSITION AND RE-DISPLAYS THE       \ ALTERED SCREEN )                                              -->                                                             \ DELETE-LINE  UPDATE&FLUSH                          16MAR82DAN)                                                                : DELETE-LINE   (S POS --- )                                       >LINE# DUP LINE#> SHRINK                                        DISPLAY-TO-EOS ;                                                                                                             (P DELETE-LINE REMOVES THE LINE THE CURSOR IS ON AND RE-DISPLAYS\ THE RESULTING SCREEN )                                                                                                        : UPDATE&FLUSH   (S --- ) \ MOVE MODIFIED SCREEEN BUFFER TO BLKS   SCR @ B/SCR * DUP B/SCR + SWAP    \ LOOP THRU BLKS OF SCREEN    DO I B/SCR MOD B/BUF * SCR-BUF +  \ FROM SCREEN BUFFER             I BLOCK B/BUF CMOVE     \ TO BLOCK BUFFER                       UPDATE LOOP             \ MARK AS UPDATED                    FLUSH   ;                  \ FLUSH TO DISK                   -->                                                             \ INS-CHAR                                           16MAR82DAN)                                                                : INS-CHAR   (S CHAR POS --- )                                     DUP DUP 1+                 \ CHAR POS FROM TO                   OVER CHARS-TO-EOL 1-       \ CHAR POS FROM TO LEN               BUF-MOVE                   \ MOVE IT                            BUF-ADR C! ;               \ AND STICK IN CHAR                                                                               (P INS-CHAR INSERTS THE GIVEN CHARACTER INTO THE DISK BUFFER.   \ NOTE THAT CHARACTERS FALLING OFF THE RIGHT END OF THE LINE    \ ARE LOST IF CAUTION IS NOT USED. )                                                                                            -->                                                                                                                                                                                                                                                             \ DEL-CHAR                                           16MAR82DAN)                                                                : DEL-CHAR   (S POS --- )                                          DUP DUP 1+ SWAP             \ POS FROM TO                       OVER CHARS-TO-EOL           \ POS FROM TO LEN                   BUF-MOVE                    \ MOVE IT                           DUP CHARS-TO-EOL + 1-       \ POSITION AT EOL                   BUF-ADR BL SWAP C! ;        \ AND STICK IN A BLANK                                                                           (P DEL-CHAR DELETES THE CHARACTER AT THE SPECIFIED CURSOR       \ POSITION )                                                                                                                    -->                                                                                                                                                                                                                                                             \ ARROW COMMANDS                                     16MAR82DAN)                                                                : R-ARROW   (S --- )                                               1 +CURPOS ;                \ MOVE RIGHT BY ONE                                                                               : L-ARROW   (S --- )                                               -1 +CURPOS ;               \ MOVE LEFT BY ONE                                                                                : U-ARROW   (S --- )                                               C/L MINUS +CURPOS ;        \ MOVE UP BY ONE                                                                                  : D-ARROW   (S --- )                                               C/L +CURPOS ;              \ MOVE DOWN BY ONE                                                                                -->                                                                                                                             \ I-LINE D-LINE D-CHAR INSERT-MODE                   16MAR82DAN)                                                                : I-LINE   (S --- )                                                CURPOS INSERT-LINE ;                                                                                                         : D-LINE   (S --- )                                                CURPOS DELETE-LINE ;                                                                                                         : D-CHAR   (S --- )                                                CURPOS DEL-CHAR                                                 CURPOS DISPLAY-TO-EOL ;                                                                                                      : INSERT-MODE   (S --- )                                           &MODE 1 TOGGLE ;                                                                                                             -->                                                             \ RETURN EXIT-EDIT                                   16MAR82DAN): RETURN   (S --- )  \ LINES 2 NOT IN ORIGINAL                     0 MOVE-CURSOR  CURPOS DISPLAY-TO-EOL \ APPLE ERASES AFTER CR    CURPOS >LINE#               \ GET LINE NUMBER OF CURRENT LINE   1+                          \ INCREMENT BY ONE                  [ L/SCR 1- ] LITERAL MIN    \ DON'T MOVE BELOW BOTTOM           LINE#> &CURSOR ! ;          \ AND MOVE THERE                 (P RETURN IS EXECUTED WHENEVER THE CARRIAGE RETURN KEY          \ IS PRESSED. IT MOVES THE CURSOR TO THE BEGINNING OF THE       \ NEXT LINE. IF THE CURSOR IS AT THE BOTTOM OF THE SCREEN,      \ IT REMAINS THERE. )                                           : EXIT-EDIT   (S --- )                                             CR R> DROP R> DROP R> DROP R> DROP R> DROP ;                 (P GET OUT OF THE EDITOR AND RETURN TO PREVIOUS ACTIVITY )      -->                                                                                                                             \ EXIT-UPDATE                                        16MAR82DAN)\ MODIFIED BECAUSE BLOCKS<1024 AND SCREEN BUFFER USED           : EXIT-UPDATE   (S --- )                                           C/SCR MOVE-CURSOR              \ GET TO BOTTOM OF SCREEN        CR CR                          \ SKIP TWO LINES                 SCR @ .                        \ TELL USER SCREEN NUMBER        &UPDATE @ IF                   \ HAS IT CHANGED?                  &E-ID [ C/L 11 - ] LITERAL   \ FROM                             BUF-ADR 10 CMOVE             \ TO                               41 C/L 1 - BUF-ADR C!        \ STORE ')' FOR COMMENT            ." MODIFIED" UPDATE&FLUSH    \ YES, TELL USER                 ELSE ." UNMODIFIED" ENDIF      \ NO, LET HIM KNOW               EXIT-EDIT ;                    \ GET OUT OF EDITOR           (P EXIT-UPDATE LEAVES THE EDITOR AND RETURNS TO FORTH. IF       \ THE SCREEN HAS BEEN MODIFIED, THE USER ID IS INSERTED ON LINE \ 0 IN THE RIGHT HAND CORNER )  -->                             \ EXIT-SCRATCH                                       16MAR82DAN)                                                                : EXIT-SCRATCH   (S --- )                                          C/SCR MOVE-CURSOR            \ GET TO BOTTOM OF SCREEN          CR CR                        \ SKIP TWO LINES                   SCR ?                        \ TELL USER SCREEN NUMBER          ." ABANDONED"                \ AND WARN ABOUT STATUS            EXIT-EDIT ;                  \ GET OUT OF EDITOR                                                                             (P EXIT-SCRATCH WILL LEAVE THE EDITOR AND NOT FLUSH THE         \ SCREEN TO DISK. THE SCREEN IS NOT MARKED AS UPDATED, BUT      \ THIS CAN BE DONE MANUALLY WITH THE UPDATE COMMAND. IT MAY THEN\ BE FLUSHED WITH THE FLUSH COMMAND, OR ERASED WITH THE         \ EMPTY-BUFFERS COMMAND )                                                                                                       -->                                                             \ E-TAB                                              16MAR82DAN)                                                                : E-TAB   (S --- )                                                 8 CURPOS 8 MOD -                                                +CURPOS ;                                                                                                                    (P MOVE THE CURSOR TO THE NEXT TAB STOP. TABS ARE CURRENTLY     \ DEFINED AS BEING 8 APART, CAN BE RE-DEFINED BY SIMPLY         \ ALTERING E-TAB )                                                                                                              -->                                                                                                                                                                                                                                                                                                                                                                                             \ SCAN+=                                             16MAR82DAN): SCAN+=        (S CHAR ADR1 ADR2 --- N )                          2DUP = IF            \ RETURN ZERO IF THERE                       DROP 2DROP 0       \ IS NOTHING TO SEARCH                     ELSE                                                              0 ROT ROT DO       \ OTHERWISE RUN THROUGH MEMORY                 OVER I C@ = IF   \ FROM LOW TO HIGH                               LEAVE          \ LOOKING FOR SPECIFIED CHARACTER              ELSE 1+ ENDIF                                                 LOOP                                                            SWAP DROP          \ RETURN RESULT                            ENDIF ;                                                      (P SCANS THROUGH MEMORY STARTING AT ADR2 TO ADR1 AND            \ INCREMENTING BY +1 LOOKING FOR THE SPECIFIED CHARACTER.       \ RETURNS THE NUMBER OF CHARACTERS SCANNED UNTIL SUCCESS )      -->                                                             (  SCAN+<>                                           21AUG82WDW): SCAN+<>                                                          2DUP = IF             \ RETURN ZERO IF THERE                       DROP 2DROP 0       \ IS NOTHING TO SEARCH                     ELSE                                                              0 ROT ROT DO       \ OTHERWISE RUN THROUGH MEMORY                 OVER I C@ <> IF  \ FROM LOW TO HIGH                               LEAVE          \ UNTIL ANY CHARACTER BUT THE                  ELSE 1+ ENDIF    \ SPECIFIED ONE IS SEEN                      LOOP                                                            SWAP DROP          \ RETURN RESULT                            ENDIF ;                                                     (P SCANS THROUGH MEMORY STARTING AT ADR2 TO ADR1 AND            \ INCREMENTING BY +1 UNTIL ANY CHARACTER NOT MATCHING THE ONE   \ SPECIFIED IS FOUND. RETURNS COUNT OF CHARACTERS SCANNED )     -->                                                             \ SCAN-=                                             16MAR82DAN): SCAN-=          (S CHAR ADR1 ADR2 --- N )                          2DUP = IF            \ RETURN ZERO IF THERE                       DROP 2DROP 0       \ IS NOTHING TO SEARCH                     ELSE                                                              0 ROT ROT DO       \ OTHERWISE RUN THROUGH MEMORY                 OVER I C@ = IF   \ FROM LOW TO HIGH                               LEAVE          \ LOOKING FOR THE SPECIFIED CHARACTER          ELSE 1- ENDIF                                                 -1 +LOOP                                                        SWAP DROP          \ RETURN RESULT                            ENDIF ;                                                    (P SCANS THROUGH MEMORY STARTING AT ADR2 TO ADR1 AND            \ DECREMENTING BY -1 LOOKING FOR THE SPECIFIED CHARACTER.       \ RETURNS THE NUMBER OF CHARACTERS SCANNED UNTIL SUCCESS )      -->                                                             \ SCAN-<>                                            16MAR82DAN): SCAN-<>         (S CHAR ADR1 ADR2 --- N )                        2DUP = IF              \ RETURN ZERO IF THERE                       DROP 2DROP 0       \ IS NOTHING TO SEARCH                     ELSE                                                              0 ROT ROT DO       \ OTHERWISE RUN THROUGH MEMORY                 OVER I C@ <> IF  \ FROM LOW TO HIGH                               LEAVE          \ UNTIL ANY CHARACTER BUT THE                  ELSE 1- ENDIF    \ SPECIFIED ONE IS SEEN                      -1 +LOOP                                                        SWAP DROP          \ RETURN RESULT                            ENDIF ;                                                    (P SCANS THROUGH MEMORY STARTING AT ADR2 TO ADR1 AND            \ DECREMENTING BY -1 UNTIL ANY CHARACTER NOT MATCHING THE       \ SPECIFIED ONE IS FOUND. RETURNS COUNT OF CHARACTERS SCANNED ) -->                                                             \ MOVE-LEFT-WORD                                     16MAR82DAN): MOVE-LEFT-WORD   (S --- N )                                      BL 0 BUF-ADR BUFPOS          \ SCAN BACKWARDS FOR THE           SCAN-= >R                    \ FIRST BLANK                      BL 0 BUF-ADR BUFPOS R +      \ NOW SCAN BACKWARDS FOR THE       SCAN-<> R> + >R              \ FIRST NON BLANK                  BL 0 BUF-ADR BUFPOS R +      \ FINALLY LOOK FOR THE FIRST       SCAN-= R> +                  \ BLANK AGAIN.                     DUP BUFPOS + C@ BL = IF      \ CORRECT FOR THE POSSIBILITY       1+                          \ THAT BLANK WAS NOT FOUND         ENDIF ;                      \ AT THE BEGINNING OF THE SCREEN(P RETURNS THE NUMBER OF CHARACTERS THAT MUST BE SKIPPED TO     \ MOVE TO THE BEGINNING OF THE PREVIOUS WORD, RELATIVE TO THE   \ CURRENT CURSOR POSITION. THE NUMBER RETURNED IS ALWAYS LESS   \ THAN OR EQUAL TO ZERO )                                       -->                                                             \ MOVE-RIGHT-WORD                                    16MAR82DAN)                                                                : MOVE-RIGHT-WORD   (S --- N )                                     BL [ C/SCR 1- ] LITERAL BUF-ADR                                 BUFPOS SCAN+= >R                                                BL [ C/SCR 1- ] LITERAL BUF-ADR                                 BUFPOS R +                                                      SCAN+<> R> + ;                                                                                                               (P RETURNS THE NUMBER OF CHARACTERS THAT MUST BE SKIPPED TO     \ MOVE TO THE BEGINNING OF THE NEXT WORD RELATIVE TO THE CURRENT\ CURSOR POSITION. )                                                                                                            -->                                                                                                                                                                                             \ R-WORD L-WORD                                      16MAR82DAN)                                                                : R-WORD   (S --- )                                                MOVE-RIGHT-WORD           \ MOVE FORWARD 1 WORD                 +CURPOS ;                 \ AND UPDATE CURSOR                (P R-WORD MOVES THE CURSOR RIGHT 1 WORD. THE CURSOR IS LEFT     \ AT THE BEGINNING OF THE WORD. IF THERE ISN'T ANY, THE CURSOR  \ MOVES TO THE END OF THE SCREEN )                                                                                              : L-WORD   (S --- )                                                MOVE-LEFT-WORD            \ MOVE BACKWARDS 1 WORD               +CURPOS ;                 \ AND UPDATE CURSOR                (P L-WORD MOVES THE CURSOR LEFT 1 WORD. THE CURSOR IS LEFT      \ AT THE END OF THE PREVIOUS WORD. IF THERE ISN'T ANY, THE      \ CURSOR MOVES TO THE BEGINNING OF THE SCREEN )                 -->                                                             \ DEL-CHARS                                          16MAR82DAN)                                                                : DEL-CHARS   (S N POS --- )                                       2DUP + OVER          \ N P FROM P                               DUP CHARS-TO-EOL     \ N P F P L                                BUF-MOVE             \ N P                                      DUP CHARS-TO-EOL +   \ N EOL                                    OVER - BUF-ADR       \ N EOL-N                                  SWAP BLANKS ;        \ FILL END WITH BLANKS                                                                                  (P DEL-CHARS DELETES N CHARACTERS STARTING AT POSITION POS.     \ THIS IS USED MAINLY FOR DELETING ENTIRE WORDS AT ONE TIME.    \ IT IS MUCH FASTER THAN CALLING DEL-CHAR N TIMES FOR MOST      \ WORDS )                                                                                                                       -->                                                             \ D-WORD                                             16MAR82DAN)                                                                : D-WORD   (S --- )                                                MOVE-RIGHT-WORD              \ MOVE OVER 1 WORD                 CURPOS BUF-ADR               \ BUT LESS THAN LAST BLANK         CURPOS CHARS-TO-EOL          \ ON THE CURRENT LINE              -TRAILING SWAP DROP          \ FOR SPEED                        MIN CURPOS DEL-CHARS         \ AND DELETE TEXT                  CURPOS DISPLAY-TO-EOL ;      \ AND SHOW RESULT                                                                               (P D-WORD DELETES THE NEXT WORD IN THE INPUT STREAM. NOTE       \ THAT CHARACTER AND WORD DELETION AFFECT ONLY THE CURRENT      \ LINE )                                                                                                                        -->                                                                                                                             \ U-TAB D-TAB CLR-SCREEN                             16MAR82DAN): U-TAB   (S --- )                                                 4 C/L *              \ MOVE UP 4 LINES                          MINUS +CURPOS ;                                                                                                              : D-TAB   (S --- )                                                 4 C/L *              \ MOVE DOWN 4 LINES                        +CURPOS ;                                                                                                                    : CLR-SCREEN   (S --- )                                            0 &CURSOR !          \ RESET CURSOR                             CURPOS BUF-ADR       \ GET BUFFER ADDRESS                       C/SCR BLANKS         \ AND SET ALL TO BLANKS                    0 DISPLAY-TO-EOS     \ AND RE-DISPLAY                           E-UPDATE ;           \ INDIACTE SCREEN CHANGED               -->                                                             \ DISPLAY-STATUS                                     16MAR82DAN)                                                                : DISPLAY-STATUS   (S --- )                                        &MODE @ &OLD-MODE @ <> IF   \ HAS MODE CHANGED?                  40 0 CRTXY                 \ MOVE CURSOR                        &MODE @  IF                \ 1=INSERT 0=OVERSTRIKE               ." INSERT ON"             \ DISPLAY MESSAGE ON THE             ELSE                       \ STATUS LINE                         9 SPACES                                                       ENDIF                                                           &MODE @ &OLD-MODE !        \ RESET OLD MODE                    ENDIF                                                           CURPOS C/L /MOD             \ CHAR POS, LINE#                   35 0 CRTXY 2 .R             \ DISPLAY LINE#                     28 0 CRTXY 2 .R ;           \ DISPLAY CHAR#                  -->                                                             \ CLR-LINE                                           16MAR82DAN)                                                                : CLR-LINE   (S --- )                                              CURPOS DUP                \ SAVE CURRENT CURSOR POSITION        >LINE# LINE#> &CURSOR !   \ GET TO BEGINNING OF LINE            CURPOS BUF-ADR            \ BUFFER ADDRESS OF EOL               C/L BLANKS                \ BLANK IT OUT                        E-UPDATE                  \ INDIACTE TEXT HAS CHANGED           0 MOVE-CURSOR             \ GET TO BEGINNING                    CURPOS CLEAR-TO-EOL       \ AND CLEAR THE LINE                  &CURSOR ! ;               \ RESTORE THE CURSOR                                                                               (P CLR-LINE SETS THE CURRENT LINE TO BLANKS )                                                                                   -->                                                                                                                             \ GET-USER-ID                                        16MAR82DAN)                                                                : GET-USER-ID   (S --- )                                           &E-ID 10 -TRAILING 0= IF     \ IS USER ID BLANK?                 CR ." ENTER YOUR ID: "      \ PROMPT USER                       10 0 DO 46 ( . ) EMIT LOOP  \ DISPLAY FIELD LENGTH              10 0 DO 8  ( BS ) EMIT LOOP \ AND BACK UP                       10 EXPECT                   \ LET THE USER ENTER IT             &E-ID 10 -TIDY              \ REPLACE CONTROL CHARS WITH BLK   ELSE                         \ ALREADY ENTERED USER ID           DROP                        \ IF HERE                          ENDIF ;                                                                                                                      (P GET-USER-ID CHECKS TO SEE IF THE USER'S ID HAS BEEN SET, AND \ IF NOT, PROMPTS HIM FOR IT AND SAVES IT )                     -->                                                             \ CONTROL CHARACTER DEFINITIONS                      16MAR82DAN)                                                                CASE: (CONTROL-CHAR)   (S N --- )                                                                                                  BEEP         \ 0: ^@ --- ERROR                                  L-WORD       \ 1: ^A --- LEFT WORD                              CLR-LINE     \ 2: ^B --- CLEAR LINE                             D-TAB        \ 3: ^C --- DOWN 4 LINES                           R-ARROW      \ 4: ^D --- RIGHT ARROW                            U-ARROW      \ 5: ^E --- UP ARROW                               R-WORD       \ 6: ^F --- RIGHT WORD                             D-CHAR       \ 7: ^G --- DELETE CHAR                            L-ARROW      \ 8: ^H --- LEFT ARROW                             E-TAB        \ 9: ^I --- TAB TO NEXT COLUMN                  -->                                                                                                                             \ CONTROL CHARACTER DEFINITIONS                      16MAR82DAN)                                                                   BEEP         \ 10: ^J --- ERROR                                 CLR-SCREEN   \ 11: ^K --- CLEAR SCREEN                          BEEP         \ 12: ^L --- ERROR                                 RETURN       \ 13: ^M --- CARRIAGE RETURN                       I-LINE       \ 14: ^N --- INSERT LINE                           BEEP         \ 15: ^O --- ERROR                                 BEEP         \ 16: ^P --- ERROR                                 BEEP         \ 17: ^Q --- ERROR                                 U-TAB        \ 18: ^R --- UP 4 LINES                            L-ARROW      \ 19: ^S --- LEFT ARROW                         -->                                                                                                                                                                                                                                                             \ CONTROL CHARACTER DEFINITIONS                      16MAR82DAN)                                                                   D-WORD       \ 20: ^T --- DELETE WORD                           BEEP         \ 21: ^U --- ERROR                                 INSERT-MODE  \ 22: ^V --- TOGGLE INSERT MODE                    BEEP         \ 23: ^W --- ERROR                                 D-ARROW      \ 24: ^X --- DOWN ARROW                            D-LINE       \ 25: ^Y --- DELETE LINE                           EXIT-SCRATCH \ 26: ^Z --- ABANDON SCREEN                        EXIT-UPDATE  \ 27: ESC --- EXIT EDITOR NORMALLY                 ;                                                                                                                            -->                                                                                                                                                                                                                                                             \ CONTROL-CHAR                                       16MAR82DAN)                                                                : CONTROL-CHAR   (S CHAR --- )                                     DUP 127 = IF          \ IF ITS A DELETE                           DROP 8              \ THEN TURN IT INTO                       ENDIF                 \ A BACKSPACE                             DUP 28 < IF           \ MIGHT IT BE VALID?                        (CONTROL-CHAR)      \ YES, SO GO DO IT                        ELSE                                                              DROP BEEP           \ NO, COMPLAIN                            ENDIF ;                                                                                                                      (P PROCESS A CONTROL CHARACTER. IF THE CHARACTER IS A DELETE    \ IT IS CHANGED INTO A BACKSPACE. IF IT IS LESS THAN OR EQUAL TO\ AN ESCAPE, IT IS EXECUTED, OTHERWISE WE BEEP. )               -->                                                             \ E-OVERSTRIKE                                       16MAR82DAN)                                                                : E-OVERSTRIKE   (S --- )                                          KEY DUP                   \ GET NEXT KEYSTROKE                  ?PRINTABLE IF             \ IF ITS PRINTABLE                     DUP EMIT                 \ SHOW IT ON THE SCREEN                BUFPOS C!                \ STICK IT IN THE BUFFER               E-UPDATE                 \ BUFFER HAS CHANGED                   1 +CURPOS                \ AND MOVE CURSOR                     ELSE                                                             CONTROL-CHAR             \ ELSE PROCESS IT AS A COMMAND        ENDIF ;                                                      (P E-OVERSTRIKE IS CALLED WHENEVER THE EDITOR IS IN             \ OVERSTRIKE MODE. NOTE THAT ONLY A SINGLE CHARACTER IS         \ PROCESSED, AND CONTROL IS ALWAYS RETURNED TO THE MAIN         \ PROCESSING LOOP )   -->                                       \ E-INSERT                                           16MAR82DAN)                                                                : E-INSERT   (S --- )                                              KEY DUP                     \ GET THE NEXT CHARACTER            ?PRINTABLE IF               \ CHECK IF ITS PRINTABLE             CURPOS INS-CHAR            \ IF SO, INSERT IT HERE              CURPOS DISPLAY-TO-EOL      \ RE-DISPLAY THE LINE                1 +CURPOS                  \ AND MOVE OVER 1                   ELSE                                                             CONTROL-CHAR               \ ELSE PROCESS THE COMMAND          ENDIF ;                                                                                                                      (P E-INSERT IS CALLED WHENEVER THE EDITOR IS IN INSERT MODE.    \ NOTE THAT ONLY A SINGLE CHARACTER IS PROCESSED AND CONTROL IS \ RETURNED IMMEDIATELY TO THE CALLING ROUTINE. )                -->                                                             \ E-INIT                                             16MAR82DAN)\ MODIFIED SINCE BLK<1024. BLKS MOVED TO SCREEN BUFFER          : E-INIT   (S [N] --- )                                            DEPTH IF SCR ! ENDIF       \ EDIT LAST SCREEN IF STACK EMPTY    SCR @ MOVE-SCR SCR-BUF &BUF-ADR ! \ MOVE SCREEN TO BUFFER       GET-USER-ID CRTCLR-SCR     \ GET DATE AND NAME & CLEAR SCREEN   0 &MODE !  0 &CURSOR !     \ INIT VARIABLES                     0 &UPDATE !                \ NOT MODIFIED                       0 %Y-OFF CRTXY             \ MOVE CURSOR TO START               L/SCR 0 DO                 \ DISPLAY LINE NUMBERS FOR USER       I 3 .R CR                                                      LOOP                                                            10 0 CRTXY                 \ MOVE TO STATUS LINE                ." SCR: " SCR @ 4 .R 6 SPACES ." X=     Y="                     0 DISPLAY-TO-EOS ;         \ SHOW THE SCREEN                 -->                                                             \ E                                                  16MAR82DAN)        FORTH DEFINITIONS                                       : E   (S [N] --- )                                                 EDITOR               \ LOOK THROUGH THE EDITOR VOCABULARY       E-INIT               \ INITIALIZE THE SCREEN                    BEGIN                \ THIS IS THE ONLY LOOP IN THE EDITOR       DISPLAY-STATUS      \ DISPLAY THE STATUS ON LINE 0              0 MOVE-CURSOR       \ MOVE THE CURSOR TO WHERE IT SHOULD BE     &MODE @ IF          \ CHECK THE MODE, 1=INSERT 0=OVERSTRIKE      E-INSERT                                                       ELSE                                                             E-OVERSTRIKE                                                   ENDIF                                                          AGAIN ;                                                      (P USED TO INVOKE THE EDITOR. SCREEN NUMBER SHOULD BE ON STK )  -->                                                             \ ASK USER ABOUT HIS TERMINAL                        21AUG82WDW)\ MODIFIED TO ADD APPLE & SMARTERM                              CR ." IF YOUR TERMINAL IS ONE OF THE ONES LISTED BELOW"         CR ." JUST ENTER THE CORRESPONDING NUMBER. IF NOT, YOU"         CR ." WILL HAVE TO WRITE YOUR OWN CURSOR ADDRESSING ROUTINES"   CR CR                                                           CR ." 0 = NONE OF THE BELOW"                                    CR ." 1 = PERKIN ELMER BANTAM"                                  CR ." 2 = LEAR ZIEGLER ADM3"                                    CR ." 3 = APPLE ][ AND SMARTERM"                                CR ." 4 = APPLE ]["                                             CR CR                                                           CR ." ENTER YOUR TERMINAL NUMBER PLEASE " RE-FORTH                                                                                 EDITOR DEFINITIONS 89  + LOAD FORTH DEFINITIONS              CR ." READY TO EDIT" CR CR                                      \ NO SUCH TERMINAL                                   16MAR82DAN)                                                                CR                                                              CR                                                              CR ." WELL, TAKE A LOOK AT SCREENS 42 - 44 "                       ." TO SEE HOW TO PROCEED"                                    CR ." IF YOU WOULD LIKE ME TO INCLUDE YOUR TERMINAL ROUTINES"   CR ." IN THE NEXT RELEASE OF THIS EDITOR, PLEASE SEND ME"       CR ." THE CODE YOU WROTE TO DRIVE YOUR TERMINAL.  THANKS."      CR ." GOOD LUCK, AND MAY THE FORTH BE WITH YOU"                 CR CR                                                                                                                                                                                                                                                                                                                                                                                           \ PERKIN-ELMER CURSOR ROUTINES                       16MAR82DAN)                                                                : PE-CRTXY   (S X Y --- )                                          32 + 88 27 EMIT EMIT EMIT                                       32 + 89 27 EMIT EMIT EMIT ;                                                                                                  : PE-CRTCLR-SCR   (S --- )                                         75 27 EMIT EMIT                                                 10 0 DO 0 EMIT LOOP ;                                                                                                        : PE-CRTCLR-EOL   (S N --- )                                       DROP 73 27 EMIT EMIT ;                                                                                                       ' PE-CRTXY        CFA  'CRTXY !                                 ' PE-CRTCLR-SCR   CFA  'CRTCLR-SCR !                            ' PE-CRTCLR-EOL   CFA  'CLEAR-TO-EOL !                          \ ADM-3 CURSOR ROUTINES                              16MAR82DAN)                                                                : ADM3-CRTXY   (S X Y --- )                                        27 EMIT 61 EMIT  ( ESC = )                                      32 + EMIT 32 + EMIT ;                                                                                                        : ADM3-CRTCLR-SCR   (S --- )                                       26 EMIT    ( ^Z )                                               10 0 DO 0 EMIT LOOP ;                                                                                                        : ADM3-CRTCLR-EOL   (S N --- )                                     C/L MOD C/L SWAP - SPACES ;                                                                                                  ' ADM3-CRTXY      CFA  'CRTXY !                                 ' ADM3-CRTCLR-SCR CFA  'CRTCLR-SCR !                            ' ADM3-CRTCLR-EOL CFA  'CLEAR-TO-EOL !                          \ APPLE ][ AND SMARTERM CURSOR ROUTINES              16MAR82DAN)\ NOT PRESENT IN ORIGINAL                                       : APS-CRTXY   (S X Y --- )                                         32 + SWAP 32 +      \ Y+OFFSET X+OFFSET                         30 EMIT EMIT EMIT ; \ RS X Y                                                                                                 : APS-CRTCLR-SCR   (S --- )                                        12 EMIT ;           \ CNTL-L                                                                                                 : APS-CRTCLR-EOL   (S N --- )                                      DROP 29 EMIT ;      \ DON'T NEED COLUMN NUMBER. CNTL-]                                                                       ' APS-CRTXY        CFA  'CRTXY !                                ' APS-CRTCLR-SCR   CFA  'CRTCLR-SCR !                           ' APS-CRTCLR-EOL   CFA  'CLEAR-TO-EOL !                                                                                         \ APPLE ][ CURSOR ROUTINES                           04MAR82WDW)\ NOT PRESENT IN ORIGINAL                                       BASE @ HEX                                                      : APS-CRTXY   (S X Y --- )                                        25 C! 24 C! FC22 CALL ;                                                                                                       : APS-CRTCLR-SCR     (S --- )                                     FC58 CALL ;                                                                                                                   : APS-CRTCLR-EOL     (S N --- )                                   DROP FC9C CALL ;                                                                                                              ' APS-CRTXY          CFA 'CRTXY !                               ' APS-CRTCLR-SCR     CFA 'CRTCLR-SCR !                          ' APS-CRTCLR-EOL     CFA 'CLEAR-TO-EOL !                        BASE !                                                          \               THE REST IS SILENCE                  16MAR82DAN)                                                                *******************************************************         *                                                     *         *    PLEASE DIRECT ALL QUESTIONS, COMMENTS, AND       *         *    MISC. PERSONAL ABUSE TO:                         *         *                                                     *         *              HENRY LAXEN                            *         *              1259 CORNELL AVE.                      *         *              BERKELEY, CALIFORNIA                   *         *              96706                                  *         *                                                     *         *              (415) 525-8525                         *         *                                                     *         *******************************************************                                                                                                                              21MAR82WDW)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ( COPY,  COPYRANGE                                   06JUN82WDW)FORTH DEFINITIONS                                                                                                               : COPY ( NOS -> TOS )                                              B/SCR * OFFSET @ + SWAP B/SCR *                                 B/SCR OVER + SWAP DO DUP FORTH I                                BLOCK 2 - ! 1+ UPDATE LOOP                                      DROP FLUSH ;                                                                                                                 0 VARIABLE FROM 0 VARIABLE TO                                   : COPYRANGE >R TO ! FROM ! R>                                      0 DO FROM @ I + TO @ I +                                        COPY LOOP CR ;                                               ;S                                                                                                                                                                                              ´Ä¢
  2.  ›˚ –˙L(@›}≤ö¢eúÄÄû.Œ≈◊Δœ“‘»††††††††††††††††††††††